package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
反射如何获得的  反射可以获得当前类的方法   接口  构造方法 成员变量 父类  创建实例

* */
/*获取反射对象的三种方式
1.Class.forName(全类名)
2.xx.class
3.对象.getClass（）
*/
public class ReflectEntrance {
    //一.创建反射的三种方法
//    public static void main(String[] args) throws ClassNotFoundException{
//        //1.Class.forName()
//        Class<?> aClass = Class.forName("reflect.Dog");
//        System.out.println(aClass);
//        //2.类名.class
//        Class<Dog> bClass=Dog.class;
//        System.out.println(bClass);
//        //3.对象.getClass()
//        Dog dog = new Dog();
//        Class<?> aClass1 = dog.getClass();
//        System.out.println(aClass1);
//    }
    //二.用反射获取类的方法

    /**
     *
     * @param args
     * @throws ClassNotFoundException
     * 注意  getMethods()  getDeclaredMethods
     */
//    public static void main(String[] args)throws ClassNotFoundException {
//        Dog dog = new Dog();
//        Class<? extends Dog> aClass = dog.getClass();
//        Method[] methods = aClass.getMethods();
//        for (Method method : methods){
//            System.out.println(method.getName());
//        }
//        System.out.println("---------------------------------------");
//        Method[] declaredMethods = aClass.getDeclaredMethods();
//        for (Method method:declaredMethods){
//            System.out.println(method.getName());
//        }
//    }
    /**   getMethods 会获取到这个类以及和它有关的类的（接口、父类）public 的方法
     * staticMethod
     * setId
     * move
     * getAge
     * eat
     * setAge
     * getName
     * getId
     * setName
     * wait
     * wait
     * wait
     * equals
     * toString
     * hashCode
     * getClass
     * notify
     * notifyAll
     * ---------------------------------------
     * getDeclaredMethods只会获得当前类的所有方法  （包括private static protected）
     * staticMethod
     * setId
     * privateMethod2
     * move
     * getAge
     * eat
     * privateMethod
     * setAge
     * getName
     * getId
     * setName
     * */

    /**
     * 三、用反射获取接口
     * @param args
     * @throws ClassNotFoundException
     */
//    public static void main(String[] args) throws ClassNotFoundException{
//        Dog dog = new Dog();
//        Class<? extends Dog> aClass = dog.getClass();
//        Class<?>[] interfaces = aClass.getInterfaces();
//        for (Class<?> inter : interfaces){
//            System.out.println(inter);
//        }

    /**
     * 四、用反射获取成员变量
     * @param args
     * 注意也是有`getFields()`和`getDeclaredFields()`的区别
     * getFields 只能获得一个public 属性
     * getDeclaredFields  可以获得全部的成员变量
     */
//    public static void main(String[] args) {
//        Dog dog = new Dog();
//        Class<? extends Dog> aClass = dog.getClass();
//        Field[] fields = aClass.getFields();
//        for (Field field:fields){
//            System.out.println(field);
//        }
//        System.out.println("--------------------");
//        Field[] declaredFields = aClass.getDeclaredFields();
//
//        for (Field field:declaredFields){
//            System.out.println(field);
//        }
//    }
    /**
     * 五、用反射获取构造器
     *
     */
//    public static void main(String[] args) {
//
//        Class<? extends Dog> aClass = dog.getClass();
//        Constructor<?>[] constructors = aClass.getConstructors();
//        for (Constructor<?>  constructor:constructors){
//            System.out.println(constructor);
//        }
//        System.out.println("-=----------------------------");
//        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
//        for (Constructor<?>  constructor:declaredConstructors){
//            System.out.println(constructor);
//        }
//    }
    /**
     * 6用反射获取父类
     *
     */
//    public static void main(String[] args) {
//        Dog dog = new Dog();
//        Class<? extends Dog> aClass = dog.getClass();
//        Class<?> superclass = aClass.getSuperclass();
//        System.out.println(superclass);
//    }
    /**
     * 7 用反射创建实例
     */
//    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
//        Dog dog = new Dog();
//        Class<?> aClass = dog.getClass();
//        Object o = aClass.newInstance();
//        Dog dog1=(Dog)o;
//        System.out.println(dog1);
//        dog.eat();
//    }
}
